package com.ruoyi.web.controller.tool;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import com.ruoyi.common.utils.FileUploader;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


/**
 * @author fangzhuan
 * @date 2022年08月19日 10:17
 */
@Component
public class TencentUploadUtil {

    @Value("${Tencent.ak}")
    private String tencentAk;
    @Value("${Tencent.sk}")
    private  String tencentSk;
    @Value("${Tencent.bucketName}")
    private  String tencentBucketName;
    @Value("${Tencent.endPoint}")
    private  String tencentEndPoint;
    @Value("${Tencent.cosRegion}")
    private  String tencentCosRegion;

    @Autowired
    private FileUploader fileUploader;

    // 创建 COSClient 实例，这个实例用来后续调用请求
    COSClient createCOSClient() {
        // 1 初始化用户身份信息(secretId, secretKey)
        COSCredentials cred = new BasicCOSCredentials(tencentAk, tencentSk);
        // 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig中包含了设置region, https(默认http), 超时, 代理等set方法, 使用可参见源码或者接口文档FAQ中说明
        ClientConfig clientConfig = new ClientConfig(new Region(tencentCosRegion));
        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本，建议设置使用 https 协议
        // 5.6.54 及更高版本，默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 以下的设置，是可选的：
        // 设置 socket 读取超时，默认 30s
        clientConfig.setSocketTimeout(30 * 1000);
        // 设置建立连接超时，默认 30s
        clientConfig.setConnectionTimeout(30 * 1000);
        // 3 生成cos客户端
        return new COSClient(cred, clientConfig);
    }


    public Map upload(MultipartFile file) {
        // 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例，如果没有则创建
        COSClient cosClient = createCOSClient();
        // 对象键(Key)是对象在存储桶中的唯一标识。
        String key = fileUploader.check(null, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);

        try {
            PutObjectRequest putObjectRequest = new PutObjectRequest(tencentBucketName, key, file.getInputStream(), new ObjectMetadata());
            cosClient.putObject(putObjectRequest);
        } catch (CosServiceException e) {
            e.printStackTrace();
        } catch (CosClientException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            // 确认本进程不再使用 cosClient 实例之后，关闭之
            cosClient.shutdown();
        }
        Map map = new HashMap();
        map.put("url",tencentEndPoint + key);
        map.put("fileName",key);
        return map;
    }


}
